package controllers;

import groovyjarjarasm.asm.commons.GeneratorAdapter;
import helpers.ProductoHelper;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

import org.modelmapper.ModelMapper;

import datatransfer.MaterialDTO;
import datatransfer.ProductoDTO;

import models.Acabado;
import models.Afiche;
import models.Backlight;
import models.Banner;
import models.Calidad;
import models.Cliente;
import models.Display;
import models.EspecificacionPortaBanner;
import models.EspecificacionTerminacion;
import models.EstadoPresupuesto;
import models.Impresion;
import models.Laminado;
import models.Material;
import models.MaterialImprimible;
import models.MaterialLaminado;
import models.MaterialMontaje;
import models.Montaje;
import models.PortaBanner;
import models.PosicionIVA;
import models.Poster;
import models.Presupuesto;
import models.Producto;
import models.Terminacion;
import models.TipoMaterial;
import models.TipoProducto;
import models.Vinilo;
import play.cache.Cache;
import play.data.validation.Valid;
import play.mvc.*;

public class Presupuestos extends Controller {

    public static void index() {
    	List<Presupuesto> presupuestos = Presupuesto.all().fetch();
    	render(presupuestos);
    }
    
    public static void form() {
    	List<EstadoPresupuesto> estados = EstadoPresupuesto.all().fetch();
		render(estados);
	}
    
    public static void list() {
    	List<Presupuesto> presupuestos = Presupuesto.all().fetch();
    	render(presupuestos);
	}
    
    public static void show(long id) {
		Presupuesto presupuesto=Presupuesto.findById(id);
		List<EstadoPresupuesto> estados = EstadoPresupuesto.all().fetch();
		List<ProductoDTO> productos=new ArrayList<ProductoDTO>();
    	for(Producto producto : presupuesto.productos){
    		productos.add(ProductoHelper.convert(producto));
    	}
		render("@form", presupuesto, estados, productos);
	}
    
    public static void save(@Valid Presupuesto presupuesto) {
    	presupuesto.estado = EstadoPresupuesto.findById(Long.parseLong(params.get("presupuesto.estado"))); 
    	presupuesto.save();
    	renderJSON(presupuesto.id);
	}
    
    public static void delete(long id) {
		Presupuesto presupuesto = Presupuesto.findById(id);					
		presupuesto.delete();
				
		list();
	}
    
    public static void producto() {
    	List<Material> mImpresiones=MaterialImprimible.find("deleted=?", false).fetch();
		List<Material> mLaminados=MaterialLaminado.find("deleted=?", false).fetch();
		List<Material> mMontajes=MaterialMontaje.find("deleted=?", false).fetch();
		List<Calidad> calidades=Calidad.find("deleted=?", false).fetch();
		List<EspecificacionTerminacion> terminaciones=EspecificacionTerminacion.find("deleted=?", false).fetch();
		List<EspecificacionPortaBanner> portaBanners=EspecificacionPortaBanner.find("deleted=?", false).fetch();
			
		render(mImpresiones, mLaminados, mMontajes, calidades, terminaciones, portaBanners);
	}
    
    public static void saveProducto(ProductoDTO productoDTO, long presupuestoId) {
    	Presupuesto presupuesto = Presupuesto.findById(presupuestoId);
    	
    	if(productoDTO.id!=null){
    		Producto p = Producto.findById(productoDTO.id);
    		p.delete();
    		productoDTO.id=null;
    	}
    	
    	Producto producto=ProductoHelper.convert(productoDTO);
    	producto.save();   	
    	presupuesto.productos.add(producto);
        presupuesto.save();
        productos(presupuestoId);
	}
    
    public static void showProducto(long id) {
    	List<Material> mImpresiones=MaterialImprimible.find("deleted=?", false).fetch();
		List<Material> mLaminados=MaterialLaminado.find("deleted=?", false).fetch();
		List<Material> mMontajes=MaterialMontaje.find("deleted=?", false).fetch();
		List<Calidad> calidades=Calidad.find("deleted=?", false).fetch();
		List<EspecificacionTerminacion> terminaciones=EspecificacionTerminacion.find("deleted=?", false).fetch();
		List<EspecificacionPortaBanner> portaBanners=EspecificacionPortaBanner.find("deleted=?", false).fetch();
		
		Producto p = Producto.findById(id);
		
		ProductoDTO productoDTO = ProductoHelper.convert(p);
		
		render("@producto", productoDTO, mImpresiones, mLaminados, mMontajes, calidades, terminaciones, portaBanners);
    	
	}
    
    public static void deleteProducto(long id, long presupuestoId) {
		Producto producto  = Producto.findById(id);
		producto.delete();
		productos(presupuestoId);
	}
    
    public static void productos(Long presupuestoId) {
    	Presupuesto presupuesto = Presupuesto.findById(presupuestoId);
    	List<Producto> p = presupuesto.productos;
    	List<ProductoDTO> productos=new ArrayList<ProductoDTO>();
    	for(Producto producto : p){
    		productos.add(ProductoHelper.convert(producto));
    	}
    	
    	float precio, precioFinal, iva;
    	
    	precio=presupuesto.precio;
    	precioFinal=presupuesto.precioFinal;
    	iva=presupuesto.iva;
    	
    	render(productos, precio, precioFinal, iva);
	}
    
    public static void search() {
    	List<Cliente> clientes = Cliente.find("deleted=?", false).fetch();
		render(clientes);
	}
}